/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cl.alanis.business;

import cl.alanis.dao.ProductoDao;
import cl.alanis.dao.StockDao;
import cl.alanis.dao.VentaDao;
import cl.alanis.dao.impl.ProductoDaoImpl;
import cl.alanis.dao.impl.StockDaoImpl;
import cl.alanis.dao.impl.VentaDaoImpl;
import cl.alanis.dto.DocumentoDto;
import cl.alanis.dto.ProductoDto;
import cl.alanis.dto.StockDto;
import cl.alanis.dto.VentaDto;
import cl.alanis.exception.StockNoExisteException;
import cl.alanis.exception.StockVendidoException;
import cl.alanis.util.AlanisLog;
import java.sql.SQLException;
import org.apache.log4j.Logger;

/**
 *
 * @author nicolas
 */
public class VentaBusiness {
    VentaDao daoVenta;
    StockDao daoStock;
    ProductoDao daoProducto;
    Logger logger=AlanisLog.obtenerLogger(VentaBusiness.class);
    public void generaVenta(VentaDto venta,StockDto[] stocks) throws Exception{
        daoVenta=new VentaDaoImpl();
        daoStock=new StockDaoImpl();
        Integer codigo = null;
        StockDto stock;
        try {
             codigo=daoVenta.generaCodigo();
             venta.setCodVenta(codigo);
             daoVenta.insertarVenta(venta);
             for(int i=0;i<stocks.length;i++){
                stock=daoStock.obtenerStock(stocks[i]);
                stock.setCodVenta(codigo);
                daoStock.actualizarStock(stock);
            }
         daoVenta.commit();     
        } catch (StockNoExisteException ex) {
           logger.error("Error:"+ex);
           throw new Exception("Error en el sistema");
        } catch (Exception ex) {
            logger.error("Error:"+ex.getMessage());
             throw new Exception("Error en el sistema");
        }
       
       
        
       
    }
    
    public Object[] obtenerFilaTablaAnulaVenta(StockDto stock) throws StockNoExisteException,Exception{
        StockDto stockRetorno;
        daoStock=new StockDaoImpl();
        daoVenta=new VentaDaoImpl();
        try {
             stockRetorno=daoStock.obtenerStock(stock);
            
        }catch(StockNoExisteException e){ 
            logger.debug(e.getMessage());
            throw e;
        }catch (SQLException ex) {
            ex.printStackTrace();
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error al obtener Stock");
        }
        ProductoDto producto=new ProductoDto();
        producto.setCodProducto(stockRetorno.getCodProducto());
        producto=daoProducto.obtenerProducto(producto);
        VentaDto venta=new VentaDto();
        venta.setCodVenta(stock.getCodVenta());
        venta=daoVenta.obtenerVenta(venta);
        Object[] retorno=new Object[]{stock.getCodStock(), producto.getNombreProducto(),producto.getValorVenta(),venta.getValorTotal()*0.19,venta.getValorTotal()*1.19};
        return retorno;
    }
    
    public Object[] obtenerFilaTablaVenta(StockDto stock) throws StockNoExisteException,Exception{
        StockDto stockRetorno;
        daoStock=new StockDaoImpl();
        daoProducto=new ProductoDaoImpl();
        try {
             stockRetorno=daoStock.obtenerStock(stock);
            if(stockRetorno.getCodVenta()!=0) 
                throw new StockVendidoException("El Producto ingresado ya fue vendido");   
        }catch(StockNoExisteException e){ 
            logger.debug(e.getMessage());
            throw e;
        }catch (SQLException ex) {
            ex.printStackTrace();
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error al obtener Stock");
        }
        ProductoDto producto=new ProductoDto();
        producto.setCodProducto(stockRetorno.getCodProducto());
        producto=daoProducto.obtenerProducto(producto);
        Object[] retorno=new Object[]{stock.getCodStock(), producto.getNombreProducto(),producto.getValorVenta(),producto.getValorVenta()*0.19,producto.getValorVenta()*1.19};
        return retorno;
    }

    public VentaDto obtenerVenta(StockDto stock) throws StockNoExisteException, Exception {
        daoStock=new StockDaoImpl();
        daoVenta=new VentaDaoImpl();
         StockDto  stockRetorno=new StockDto();
         VentaDto venta=new VentaDto();
         
        try {
           stockRetorno=daoStock.obtenerStock(stock);
           venta.setCodVenta(stockRetorno.getCodVenta());
           venta=daoVenta.obtenerVenta(venta);
           venta.setStocks(daoStock.obtenerStocks(venta));
        } catch (StockNoExisteException e) {
            logger.debug(e.getMessage());
            throw e;
        } catch (Exception ex) {
            
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error al obtener Stock");
        }
        
        return venta;
    }

    public void anularVenta(StockDto stock) throws Exception {
        daoStock=new StockDaoImpl();
        daoVenta=new VentaDaoImpl();
        daoProducto=new ProductoDaoImpl();
        ProductoDto producto=new ProductoDto();
        VentaDto venta=new VentaDto();
        Float descuento;
        
        Double valorVenta,valorTotal;
        try {
            stock=daoStock.obtenerStock(stock);
            producto.setCodProducto(stock.getCodProducto());
            producto=daoProducto.obtenerProducto(producto);
            venta.setCodVenta(stock.getCodVenta());
            venta = daoVenta.obtenerVenta(venta);
            valorVenta=venta.getValorTotal();
            descuento=venta.getDescuento();
            valorTotal=valorVenta*(1+Math.ceil(descuento/100));
            valorTotal=valorTotal-producto.getValorVenta();
            valorTotal=valorTotal*(1-descuento/100);
            venta.setValorTotal(Math.ceil(valorTotal));
            daoVenta.actualizarVenta(venta);
            stock.setCodVenta(null);
            daoStock.actualizarStock(stock);
            daoVenta.commit();
            
        } catch(StockNoExisteException e){ 
            logger.debug(e.getMessage());
            throw e;
        }catch (SQLException ex) {
            ex.printStackTrace();
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error en el sistema");
        }catch(Exception e){
            logger.error("Error:"+e.getMessage());
            throw e;
        }
    }
    public void insertarDocumento(DocumentoDto documento){
        
    }
}
